Option Explicit

'################################################################
' Field
'################################################################
' Variant[]
Private cache As IPrimitiveArrayRef

'################################################################
' Constructor
'################################################################
Private Sub Class_Initialize()
    Set cache = UtilsArrayRef.createRealPrimitiveArrayRef()
End Sub

Private Sub Class_Terminate()
    Set cache = Nothing
End Sub

'################################################################
' Property
'################################################################
' 获取当前数组引用中已使用的长度
Public Property Get Count() As Long
    Count = cache.Count
End Property

' 获取当前栈内部存储结构中的最大索引
' 如果栈中没有任何元素，将会返回 `-1`
Public Property Get MaxIndex() As Long
    MaxIndex = cache.MaxIndex
End Property

'################################################################
' Function
'################################################################
' 获取栈中的第 i 个元素
' @param i 索引
'
' 最低位索引 `0` 是栈底，最高位 `Count - 1` 是栈顶
Public Function Item(ByRef i As Long) As Variant
    Item = cache.Item(i)
End Function

' 数据入栈
' @param 基础类型的数据
Public Sub push(ByRef v As Variant)
    cache.Add v
End Sub

' 弹出栈顶数据
' @return Variant 如果栈中已经没有数据了，则返回一个 Empty
Public Function pop() As Variant
    If cache.MaxIndex = -1 Then
        pop = Empty
    Else
        pop = cache.pollLast
    End If
End Function

' 返回栈顶数据，但是不弹出
' @return Variant 如果栈中已经没有数据了，则返回一个 Empty
Public Function peek() As Variant
    If cache.MaxIndex = -1 Then
        peek = Empty
    Else
        peek = cache.getLast
    End If
End Function

' 清空栈
Public Sub clear()
    If cache.MaxIndex = -1 Then
        Exit Sub
    End If

    cache.clear
End Sub